package com.bang.framework.mq.constants;

/**
 * @ClassName: QueueConstants
 * @author: BANG
 * @Date: 2019/12/06 17:52
 * @Version: 1.0
 * @Modified By:
 * @Desc: TODO
 */
public interface QueueConstants {

    /**
     * <p>
     *     Default Exchange
     * Default Exchange 是一种特殊的 Direct Exchange。当你手动创建一个队列时，后台会自动将这个队列绑定到一个名称
     * 为空的 Direct Exchange 上，绑定 RoutingKey 与队列名称相同。有了这个默认的交换机和绑定，
     * 使我们只关心队列这一层即可，这个比较适合做一些简单的应用。
     * </p>
     */

    interface Exchange{

        /**
         * direct
         * <p>
         *     Direct Exchange 是 RabbitMQ 默认的 Exchange，完全根据 RoutingKey 来路由消息。
         *     设置 Exchange 和 Queue 的 Binding 时需指定 RoutingKey（一般为 Queue Name），
         *     发消息时也指定一样的 RoutingKey，消息就会被路由到对应的Queue。
         *
         *     应用场景
         * 现在我们考虑只把重要的日志消息写入磁盘文件，例如只把 Error 级别的日志发送给负责记录写入磁盘文件的 Queue。
         * 这种场景下我们可以使用指定的 RoutingKey（例如 error）将写入磁盘文件的 Queue 绑定到 Direct Exchange 上。
         * </p>
         */
        String BANG_TEST_DIRECT_EXCHANGE = "bang.test.direct.exchange";


        // topic
        /**
         * <p>
         *     Topic Exchange 和 Direct Exchange 类似，也需要通过 RoutingKey 来路由消息，区别在于Direct Exchange 对 RoutingKey 是精确匹配，
         *     而 Topic Exchange 支持模糊匹配。分别支持*和#通配符，*表示匹配一个单词，#则表示匹配没有或者多个单词。
         *
         * 应用场景
         * 假设我们的消息路由规则除了需要根据日志级别来分发之外还需要根据消息来源分发，可以将 RoutingKey 定义为 消息来源.级别
         * 如 order.info、user.error等。处理所有来源为 user 的 Queue 就可以通过 user.* 绑定到 Topic Exchange 上，
         * 而处理所有日志级别为 info 的 Queue 可以通过 *.info 绑定到 Exchange上。
         *
         * </p>
         */
        String BANG_TEST_TOPIC_EXCHANGE = "bang.test.topic.exchange";

        /**
         * <p>
         *     Fanout Exchange 会忽略 RoutingKey 的设置，直接将 Message 广播到所有绑定的 Queue 中。
         *  应用场景
         *     以日志系统为例：假设我们定义了一个 Exchange 来接收日志消息，同时定义了两个 Queue 来存储消息：
         *     一个记录将被打印到控制台的日志消息；另一个记录将被写入磁盘文件的日志消息。
         *     我们希望 Exchange 接收到的每一条消息都会同时被转发到两个 Queue，这种场景下就可以使用
         *     Fanout Exchange 来广播消息到所有绑定的 Queue。
         * </p>
         */
        String BANG_TEST_FANOUT_EXCHANGE = "bang.test.fanout.exchange";

   }


    interface Queue{
        String BANG_TEST_DIRECT_QUEUE = "bang.test.direct.queue";

        String BANG_TEST_TOPIC_QUEUE_1 = "bang.test.topic.queue1";

        String BANG_TEST_TOPIC_QUEUE_2 = "bang.test.direct.queue2";

        String BANG_TEST_FANOUT_QUEUE_1 = "bang.test.fanout.queue1";

        String BANG_TEST_FANOUT_QUEUE_2 = "bang.test.fanout.queue2";

        String BANG_TEST_DEFAULT_QUEUE = "bang.test.default.queue";
   }

    interface RoutingKey{

        String BANG_TEST_DIRECT_ROUTEKEY = "bang.test.direct.routingKey";

        String BANG_TEST_TOPIC_ROUTEKEY = "bang.test.topic.#";

   }


    /**
     * 统计话费信息交换
     */
    String TCC_BILL_SUMMARY_DIRECT_EXCHANGE = "tcc.bill.summary.direct.exchange";
    /**
     * 统计话费信息消息队列名称   (消费者实际监听的queue)
     */
    String TCC_BILL_SUMMARY_QUEUE = "tcc.bill.summary.queue";
    /**
     * 统计话费信息消息路由键
     */
    String TCC_BILL_SUMMARY_ROUTE_KEY = "tcc.bill.summary.routeKey";

    /**
     * 统计话费信息交换 TTL (发送ttl消息时,实际传递的exchange)
     */
    String TCC_BILL_SUMMARY_TTL_DIRECT_EXCHANGE = "tcc.bill.summary.ttl.direct.exchange";
    /**
     * 统计话费信息消息队列名称 TTL
     */
    String TCC_BILL_SUMMARY_TTL_QUEUE = "tcc.bill.summary.ttl.queue";
    /**
     * 统计话费信息消息路由键 TTL (发送ttl消息时,实际传递的routeKey)
     */
    String TCC_BILL_SUMMARY_TTL_ROUTE_KEY = "tcc.bill.summary.ttl.routeKey";


}
